library(knitr)
library(tidyverse)
library(grid)
# library(pacman)
# p_load(grid)R 中主要存在两种绘图系统:
base R 传统图像系统
grid 图像系统
传统的图像系统是由 graphics 包所提供的一系列函数组成,grid 系统是 grid 包提供的。grid 包是一个底层的绘图系统,提供的都是底层的绘图函数,没有用于绘制复杂图形的高级函数。像 ggplot2 和 lattice 两个顶层的绘图包都是基于 grid 系统的,所以,了解 grid 包对于理解 ggplot2 的顶层函数的工作方式是很有帮助的。同时,也可以使用 grid 包来灵活地控制图形的外观和布局。
7.1 grid 图形模型
7.1.1 图形原语
grid提供了一些函数用于绘制简单的图形。
| 函数 | 功能描述 | 返回值 |
|---|---|---|
| grid.move.to | 设置当前位置 | moveToGrob |
| grid.line.to | 绘制一条从当前位置到指定位置的线并重置当前位置 | lineToGrob |
| grid.line | 绘制直线 | linesGrob |
| grid.segments | 绘制线段 | segmentsGrob |
| grid.rect | 在指定位置绘制矩形 | rectGrob |
| grid.circle | 根据位置和半径绘制圆形 | circleGrob |
| grid.polygon | 根据顶点绘制多边形 | polygonGrob |
| grid.text | 在指定位置和角度绘制文本 | textGrob |
| grid.arrows | 绘制带箭头的线 | arrowsGrob |
| grid.points | 绘制散点 | pointsGrob |
| grid.xaxis | 绘制x轴 | xaxisGrob |
| grid.yaxis | 绘制y轴 | yaxisGrob |
这些函数被称为图形原语,使用这些函数可以直接绘制对应的图形,例如
grid::grid.text(label = "让我们用grid包,开始绘图吧!")
x <- seq(-10, 10, length=1000)
grid::grid.circle(
x=x,
y=sin(x),
r=abs(0.1*sin(4*x))
)
7.1.2 坐标系统
grid 的坐标系统是用来确定数值的单位,同样的数值在不同的单位中表示不同的大小,看起来叫单位系统应该会更恰当些。
| 坐标系统 | 描述 |
|---|---|
| native | 位置和大小相对于当前viewport的x、y轴的范围 |
| npc | 将当前viewport的左下角为(0,0)右上角为(1,1) |
| snpc | 位置和大小被表示为当前viewport的宽度和高度中更小的值的比例 |
| inches | 英寸,(0,0)表示viewport的左下角 |
| cm | 厘米 |
| mm | 毫米 |
| points | 点,每英寸相当于72.27个点 |
| bigpts | 大点,每英寸相当于72个大点 |
| picas | 1pica相当于12个点 |
| dida | 1157个dida相当于1238个点 |
| cicero | 1 cicero相当于12个dida |
| scaledpts | 相当于一个点的65536分之一 |
| char | 相当于字体大小为单位(由fontsize和cex确定) |
| lines | 相当于以线条高度为单位(由fontsize,cex,lineheight确定) |
| strwidth | 相当于以字符串的宽度为单位(由fontsize, cex, fontfamily, fontface确定) |
| strheight | 相当于以字符串的高度为单位(由fontsize, cex, fontfamily, fontface确定) |
| grobwidth | 以给定图形对象的宽度为单位 |
| grobheight | 以给定图形对象的高度为单位 |
使用unit函数来设置不同的系统
unit(1,"cm")[1] 1cm
unit(1,"npc")[1] 1npc
坐标系统之间的运算将会以表达式的方式返回
unit(1,"cm") - unit(1,"npc")[1] sum(1cm, -1npc)
对于字符串及对象长度坐标系统
unit(1,"strwidth","Some Text")[1] 1strwidth
unit(1, "grobwidth", grid::textGrob("Some Text"))[1] 1grobwidth
可以使用 convertWidth 和 convertHeight 实现单位之间的转换
# library(grid)
grid::convertHeight(unit(2,"cm")-unit(1,"npc"),"mm")[1] -107mm
grid::convertHeight(unit(1,"strwidth","Some Text"),"mm")[1] 19.84375mm
我们可以使用不同的单位系统来绘制一个矩形
Text <- "让我们用grid包开始绘图吧!"
grid::grid.rect(
x=unit(0.5, "npc"),
y=unit(1, "inches"),
width=grid::stringWidth(Text),
height=unit(1, "lines")#,
# gp=gpar(fill="blue")
# just=c("left", "bottom")
)
grid::grid.text(
x=unit(0.5, "npc"),
y=unit(1, "inches"),
label =Text)
7.1.3 gpar参数对象
所有的图形原语函数都有一个 gp(graphical parameters) 参数,用来接收一个 gpar 对象,该对象包含一些图形参数用于控制图像的输出。gpar 对象可以使用 gpar() 函数来生成。
grid::gpar(col="red",lty="dashed")$col
[1] "red"
$lty
[1] "dashed"
| 参数 | 描述 |
|---|---|
| col | 线条、文本、矩形边框等的颜色 |
| fill | 矩形、圆形、多边形的填充色 |
| gamma | 颜色的gamma 校正值 |
| alpha | 透明度 |
| lwd | 线条宽度 |
| lex | 线条扩展乘子 |
| lty | 线条类型 |
| lineend | 线端,点类型:round,butt,square |
| linejoin | 线连接点类型:round,mitre,bevel |
| linemitre | 线条斜率限制 |
| cex | fontsize的扩展乘子 |
| fontsize | 字体大小(points) |
| fontface | 字体样式(bold,italic/ob1ique,plain,bold.italic或整数1-4) |
| fontfamily | 字体家族 |
| lineheight | 线高 |
使用 get.gpar 可以获取当前图形参数的值,如果未指定要获取的参数,将会返回所有的参数值
library(grid)
get.gpar(c("lty", "fill"))$lty
[1] "solid"
$fill
[1] "white"
在 grid 中,cex 参数是累积的,也就是说当前的 cex 值等于当前设置的值乘上之前的 cex 值 在一个 viewport 中设置了 cex = 0.5,之后的文本又设置了 cex = 0.5,最后文本的大小就是 0.5*0.5 = 0.25
alpha 参数与 cex 类似,也是累积的
7.1.4 画布与窗口(viewport)
library(grid)
grid.text(
"top-left corner",
x=unit(1, "mm"),
y=unit(1, "npc") - unit(1, "mm"),
just=c("left", "top")
)
pushViewport(
viewport(
width=0.8,
height=0.5,
angle=10,
name="vp1"
)
)
grid.rect()
grid.text(
"top-left corner",
x = unit(1, "mm"),
y = unit(1, "npc") - unit(1, "mm"),
just = c("left", "top")
)